/**
 * 日志工具类
 * @description 统一的日志记录工具，支持不同级别的日志输出
 * @author CRM开发团队
 * @version 1.0.0
 */

// 日志级别枚举
export enum LogLevel {
  DEBUG = 0,
  INFO = 1,
  WARN = 2,
  ERROR = 3
}

// 日志类型
export type LogType = 'app' | 'error' | 'access' | 'debug' | 'operation'

// 日志配置
export interface LoggerConfig {
  level: LogLevel
  enableConsole: boolean
  enableFile: boolean
  logDir: string
  maxFileSize: number // MB
  maxFiles: number
}

// 默认配置
const defaultConfig: LoggerConfig = {
  level: process.env.NODE_ENV === 'development' ? LogLevel.DEBUG : LogLevel.INFO,
  enableConsole: true,
  enableFile: process.env.NODE_ENV === 'production',
  logDir: './logs',
  maxFileSize: 10, // 10MB
  maxFiles: 30 // 保留30个文件
}

/**
 * 日志记录器类
 */
export class Logger {
  private config: LoggerConfig
  private static instance: Logger

  constructor(config: Partial<LoggerConfig> = {}) {
    this.config = { ...defaultConfig, ...config }
  }

  /**
   * 获取单例实例
   */
  static getInstance(config?: Partial<LoggerConfig>): Logger {
    if (!Logger.instance) {
      Logger.instance = new Logger(config)
    }
    return Logger.instance
  }

  /**
   * 格式化日志消息
   */
  private formatMessage(level: string, message: string, meta?: any): string {
    const timestamp = new Date().toISOString()
    const metaStr = meta ? ` | ${JSON.stringify(meta)}` : ''
    return `[${timestamp}] [${level}] ${message}${metaStr}`
  }

  /**
   * 获取日志文件路径
   */
  private getLogFilePath(type: LogType): string {
    const date = new Date().toISOString().split('T')[0] // YYYY-MM-DD
    return `${this.config.logDir}/${type}-${date}.log`
  }

  /**
   * 写入文件日志（在实际应用中，这里会使用真实的文件写入逻辑）
   */
  private writeToFile(type: LogType, message: string): void {
    if (!this.config.enableFile) return
    
    // 在实际应用中，这里会实现真实的文件写入逻辑
    // 例如使用 fs.appendFile 或日志库如 winston、pino 等
    console.log(`[FILE:${type}] ${message}`)
  }

  /**
   * 输出到控制台
   */
  private writeToConsole(level: LogLevel, message: string): void {
    if (!this.config.enableConsole) return

    switch (level) {
      case LogLevel.DEBUG:
        console.debug(message)
        break
      case LogLevel.INFO:
        console.info(message)
        break
      case LogLevel.WARN:
        console.warn(message)
        break
      case LogLevel.ERROR:
        console.error(message)
        break
    }
  }

  /**
   * 通用日志记录方法
   */
  private log(level: LogLevel, type: LogType, message: string, meta?: any): void {
    if (level < this.config.level) return

    const levelName = LogLevel[level]
    const formattedMessage = this.formatMessage(levelName, message, meta)

    this.writeToConsole(level, formattedMessage)
    this.writeToFile(type, formattedMessage)
  }

  /**
   * 调试日志
   */
  debug(message: string, meta?: any): void {
    this.log(LogLevel.DEBUG, 'debug', message, meta)
  }

  /**
   * 信息日志
   */
  info(message: string, meta?: any): void {
    this.log(LogLevel.INFO, 'app', message, meta)
  }

  /**
   * 警告日志
   */
  warn(message: string, meta?: any): void {
    this.log(LogLevel.WARN, 'app', message, meta)
  }

  /**
   * 错误日志
   */
  error(message: string, error?: Error | any, meta?: any): void {
    const errorMeta = error ? { 
      stack: error.stack, 
      message: error.message,
      ...meta 
    } : meta
    
    this.log(LogLevel.ERROR, 'error', message, errorMeta)
  }

  /**
   * 访问日志
   */
  access(message: string, meta?: any): void {
    this.log(LogLevel.INFO, 'access', message, meta)
  }

  /**
   * 业务操作日志
   */
  operation(message: string, meta?: any): void {
    this.log(LogLevel.INFO, 'operation', message, meta)
  }
}

// 创建全局日志实例
export const logger = Logger.getInstance()

// 便捷的日志方法
export const log = {
  debug: (message: string, meta?: any) => logger.debug(message, meta),
  info: (message: string, meta?: any) => logger.info(message, meta),
  warn: (message: string, meta?: any) => logger.warn(message, meta),
  error: (message: string, error?: Error | any, meta?: any) => logger.error(message, error, meta),
  access: (message: string, meta?: any) => logger.access(message, meta),
  operation: (message: string, meta?: any) => logger.operation(message, meta)
}

/**
 * 初始化全局错误处理
 */
export const initGlobalErrorHandling = (): void => {
  // 捕获未处理的Promise拒绝
  window.addEventListener('unhandledrejection', (event) => {
    logger.error('未捕获的Promise拒绝:', event.reason)
    event.preventDefault()
  })

  // 捕获全局JavaScript错误
  window.addEventListener('error', (event) => {
    logger.error('全局JavaScript错误:', {
      message: event.message,
      filename: event.filename,
      lineno: event.lineno,
      colno: event.colno,
      error: event.error
    })
  })

  // Vue错误处理（需要在app中设置）
  console.log('[Logger] 全局错误处理已初始化')
}

/**
 * 记录路由变化
 */
export const logRouteChange = (to: any, from: any): void => {
  logger.debug('路由变化:', {
    from: {
      path: from.path,
      name: from.name
    },
    to: {
      path: to.path,
      name: to.name,
      title: to.meta?.title
    }
  })
}

/**
 * 初始化性能监控
 */
export const initPerformanceMonitoring = async (): Promise<void> => {
  if (import.meta.env.PROD) {
    // 生产环境性能监控
    logger.info('性能监控已启用')
  }
}

export default logger